import os
import sys
import platform
import plistlib
import shutil
import logging
from PyInstaller.__main__ import run


# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)


def create_info_plist():
    """创建Info.plist文件，包含必要的权限声明"""
    info_plist = {
        'CFBundleIdentifier': 'com.rtmpcapture.app',
        'CFBundleName': '推流码抓取',
        'CFBundleDisplayName': '推流码抓取',
        'CFBundlePackageType': 'APPL',
        'CFBundleSignature': '????',
        'LSMinimumSystemVersion': '10.10.0',
        'NSHighResolutionCapable': True,
        'CFBundleIconFile': 'app.icns',
        # 添加网络访问权限声明
        'NSAppTransportSecurity': {
            'NSAllowsArbitraryLoads': True
        },
        # 添加权限描述
        'NSAppleEventsUsageDescription': '需要管理员权限来进行网络抓包',
        'NSSystemAdministrationUsageDescription': '需要管理员权限来进行网络抓包',
    }
    
    try:
        plist_path = 'Info.plist'
        with open(plist_path, 'wb') as f:
            plistlib.dump(info_plist, f)
        logger.info("成功创建 Info.plist 文件")
        return plist_path
    except Exception as e:
        logger.error(f"创建 Info.plist 失败: {str(e)}")
        return None


def check_requirements():
    """检查打包环境要求"""
    os_type = platform.system().lower()
    
    if os_type == 'darwin':
        # 检查tcpdump是否存在
        if not os.path.exists('/usr/sbin/tcpdump'):
            logger.error("未找到tcpdump，请确保系统已安装")
            return False
        
        # 检查图标文件是否存在
        if not os.path.exists('app.icns'):
            logger.error("未找到图标文件 app.icns")
            return False
    elif os_type == 'windows':
        # 检查图标文件是否存在
        if not os.path.exists('app.ico'):
            logger.error("未找到图标文件 app.ico")
            return False
    
    return True


def post_process_app():
    """处理打包后的应用"""
    try:
        os_type = platform.system().lower()
        
        if os_type == 'darwin':
            app_path = os.path.join('dist', '推流码抓取.app', 'Contents')
            if not os.path.exists(app_path):
                logger.error("未找到应用包")
                return False
                
            # 复制Info.plist
            if os.path.exists('Info.plist'):
                shutil.copy('Info.plist', os.path.join(app_path, 'Info.plist'))
                os.remove('Info.plist')
                logger.info("成功复制 Info.plist 到应用包")
                
            # 复制tcpdump到应用包
            bin_path = os.path.join(app_path, 'MacOS')
            if not os.path.exists(bin_path):
                os.makedirs(bin_path)
            tcpdump_dest = os.path.join(bin_path, 'tcpdump')
            shutil.copy('/usr/sbin/tcpdump', tcpdump_dest)
            os.chmod(tcpdump_dest, 0o755)
            logger.info("成功复制 tcpdump 到应用包")
            
            # 复制Python文件和图标
            resources_path = os.path.join(app_path, 'Resources')
            if not os.path.exists(resources_path):
                os.makedirs(resources_path)
            shutil.copy('rtmp_capture.py', os.path.join(resources_path, 'rtmp_capture.py'))
            shutil.copy('app.icns', os.path.join(resources_path, 'app.icns'))
            logger.info("成功复制资源文件到应用包")
        
        elif os_type == 'windows':
            # Windows 下复制必要文件到 dist 目录
            dist_path = os.path.join('dist', '推流码抓取')
            if not os.path.exists(dist_path):
                logger.error("未找到应用目录")
                return False
            
            # 复制Python文件
            shutil.copy('rtmp_capture.py', os.path.join(dist_path, 'rtmp_capture.py'))
            logger.info("成功复制资源文件到应用目录")
        
        return True
    except Exception as e:
        logger.error(f"处理应用包时出错: {str(e)}")
        return False


def build():
    """打包应用程序"""
    if os.path.exists('dist'):
        shutil.rmtree('dist')
    if os.path.exists('build'):
        shutil.rmtree('build')
    try:
        # 获取操作系统类型
        os_type = platform.system().lower()
        logger.info(f"当前操作系统: {os_type}")
        
        # 检查环境要求
        if not check_requirements():
            logger.error("环境检查失败，终止打包")
            return False
        
        # 创建Info.plist
        if os_type == 'darwin':
            if not create_info_plist():
                return False
        
        # 基本参数
        params = [
            'main.py',
            '--name=推流码抓取',
            '--windowed',
            '--noconfirm',
            '--clean',
        ]
        
        # 根据操作系统添加特定参数
        if os_type == 'darwin':
            params.extend([
                '--icon=app.icns',
                '--target-arch=universal2',
                '--osx-bundle-identifier=com.rtmpcapture.app',
            ])
        elif os_type == 'windows':
            params.extend([
                '--icon=app.ico',
            ])
        
        # 运行打包命令
        logger.info("开始打包...")
        run(params)
        
        # 处理打包后的应用
        if not post_process_app():
            return False
        
        logger.info("打包完成")
        return True
        
    except Exception as e:
        logger.error(f"打包过程出错: {str(e)}")
        return False


if __name__ == "__main__":
    success = build()
    sys.exit(0 if success else 1)
